/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package session;

import entities.Acteur;
import entities.Categorie;
import entities.Film;
import entities.Realisateur;
import java.io.File;
import java.util.Collection;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import wrapper.WrapperXmlFilm;

/**
 *
 * @author aurelie
 */
@Stateless
@LocalBean
public class GestionnaireDeFilms {

    @PersistenceContext(unitName = "ProjetWebPU")
    private EntityManager em;
    private WrapperXmlFilm xmlFilm;

    public void persist(Object object) {
        em.persist(object);
    }

    public void creerFilmsDeTest() {
        xmlFilm = new WrapperXmlFilm();
        String[] listeFichierXml;
        int i;
       // File file = new File("C:\\Users\\Indowax\\Documents\\NetBeansProjects\\ProjetWeb\\web\\xml");
       File file = new File("C:\\Users\\asus\\Documents\\M1\\AppliWeb\\projet\\trunk\\ProjetWeb\\web\\xml");
        listeFichierXml = file.list();
        for (i = 0; i < listeFichierXml.length; i++) { 
            File newFile = new File(file + "\\" + listeFichierXml[i]);
            try {
                if (xmlFilm.readXml(newFile))
                {
                    Film f = new Film(xmlFilm.getId(), xmlFilm.getTitreFilm(), xmlFilm.getDescriptionFilm(), xmlFilm.getFullDescriptionFilm(), xmlFilm.getNote(), xmlFilm.getAffiche(), xmlFilm.getPrixDVD(), xmlFilm.getPrixBlueray());
                    for (String lActeur : xmlFilm.getActeurs()) {
                        f.addActeur(getActeur(lActeur));
                    }
                    for(String lRealisateurs : xmlFilm.getRealisateurs()){
                        f.addRealisateur(new Realisateur(lRealisateurs));
                    }
                    for(String lCategorie : xmlFilm.getCategories()){
                        f.addCategorie(new Categorie(lCategorie));
                    }
                    persist(f);
                }
            } catch (Exception e) {
                //Erreur
            }
        }
    }

    /**
     * methode qui récupère tous les films avec tous ses attributs ds la bd
     * @return
    */
    public Collection<Film> getAllFilms(int page) {
        Query q = em.createQuery("select f from Film as f");        
        return q.getResultList();
    }

        // update to pagination
       public Collection<Film> getAllFilmsPagination(int firstResult) {
        // Exécution d'une requête équivalente à un select *
        Query q = em.createQuery("select f from Film as f");
        q.setFirstResult(firstResult);
        q.setMaxResults(5);
        return q.getResultList();
    }

  
    public Collection<Film> getAllFilmsByCategorie(String nomCategorie) {
        // Query q = em.createQuery("select f from Film as f, Categorie as c where f.categories=c.films and c.nom='"+ nomCategorie +"'");
        Query q = em.createQuery("select f from Film as f join f.categories c where c.nom='" + nomCategorie + "'");
        return q.getResultList();
    }

    
    public Collection<Film> findFilmsByTitle(String title) {
       Query q = em.createQuery("select f from Film as f where f.titre like '%" + title + "%'");
       return q.getResultList();

   }

     public Film findFilmById(String id) {
       Query q = em.createQuery("select f from Film as f where f.id = '" + id + "'");
       return (Film)q.getSingleResult();

   }
     
    public Collection<Film> findFilmsByActor(String actor) {
        Query q = em.createQuery("select f from Film as f join f.acteurs a where a.nom like '%" + actor + "%'");
        return q.getResultList();
    }

    public Collection<Categorie> getAllCategorie() {
        Query q = em.createQuery("select c.nom from Categorie as c");
        return q.getResultList();
    }

    public Acteur getActeur(String nomActeur) {
        Acteur acteurTrouve = null;
        Query q = em.createQuery("select a from Acteur as a");
        Collection<Acteur> lActeurs = q.getResultList();
        for (Acteur a : lActeurs) {
            if ( a.getNom().toUpperCase().equals(nomActeur.toUpperCase())){
                acteurTrouve = a;
                break;
            }
        }
        if ( acteurTrouve == null){
            acteurTrouve = new Acteur(nomActeur);
            persist(acteurTrouve);
        }
        return acteurTrouve;
    }

    /**
     * orderBy titre film
     */
    public Collection<Film> getAllFilmsOrderByTitle() {
        Query q = em.createQuery("select f from Film as f order by f.titre");
        return q.getResultList();
    }

   
    /**
     * orderBy note film
     */
    public Collection<Film> getAllFilmsOrderByNote() {
        Query q = em.createQuery("select f from Film as f order by f.note desc");
        return q.getResultList();
    }

    /**
     * creer un film
     */
     public Film creeFilm(int id, String titre, List<String> description, List<String> descriptionDetail, String note, String affiche, int prixDVD, int prixBlueRay) {
        Film f = new Film(id, titre, description, descriptionDetail, note, affiche, prixDVD, prixBlueRay);
        getEm().persist(f);
        return f;
    }

      /**
     * @return the em
     */
    public EntityManager getEm() {
        return em;
    }

    /**
     * @param em the em to set
     */
    public void setEm(EntityManager em) {
        this.em = em;
    }


}
